package com.kaoshi.myweb.webtest.funTest;

import javax.tools.StandardLocation;
import java.lang.reflect.Field;
import java.text.Annotation;

/**
 * Created by Administrator on 2016/12/3.
 */
public class IntegerTest {
	public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {

		System.out.println(IntegerTest.class.getCanonicalName());
		Integer e = 1000, f = 1000;
		System.out.println(e == f);//false

		Integer c = 100, d = 100;
		System.out.println(c == d);//true


		Class cache = Integer.class.getDeclaredClasses()[0]; //1
		Field myCache = cache.getDeclaredField("cache"); //2
		myCache.setAccessible(true);//3

		Integer[] newCache = (Integer[]) myCache.get(cache); //4
		newCache[132] = newCache[133]; //5


		//5,在IntegerCache中的数组位置为133，所以下面2+2=5
		int a = 2;
		int b = a + a;
		System.out.printf("%d + %d = %d", a, a, b); //

		/**我们知道，如果两个引用指向同一个对象，那么==就成立；反之，如果两个引用指向的不是同一个对象，那么==就不成立，即便两个引用的内容是一样的。因此，结果就会出现false。

		这是非常有趣的地方。如果你查看Integer.java类，你会找到IntegerCache.java这个内部私有类，它为-128到127之间的所有整数对象提供缓存。

		这个东西为那些数值比较小的整数提供内部缓存，当进行如此声明时：

		Integer c = 100;

		它的内部就是这样的：

		Integer i = Integer.valueOf(100);

		如果我们观察valueOf()类函数，我们可以看到

		public static Integer valueOf(int i) {
			if (i >= IntegerCache.low && i
			return IntegerCache.cache[i + (-IntegerCache.low)];
			return new Integer(i);
		}

		如果值在-128到127之间，它就会返回该缓存的实例。

		因此。。。

		Integer c = 100, d = 100;

		两者指向同样的对象。**/


	}
}
